package com.steve.xfood.controller;

import com.steve.xfood.VO.ProductInfoVO;
import com.steve.xfood.VO.ProductVO;
import com.steve.xfood.VO.ResultVO;
import com.steve.xfood.dataobject.ProductCategory;
import com.steve.xfood.dataobject.ProductInfo;
import com.steve.xfood.service.ProductCategoryService;
import com.steve.xfood.service.ProductInfoService;
import com.steve.xfood.util.ResultVOUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/** 买家商品
 * @author steve
 * @date 2020/5/6 16:17
 */

@RestController
@RequestMapping("/buyer/product")
public class BuyerProductController {
    @Autowired
    private ProductInfoService productInfoService;
    @Autowired
    private ProductCategoryService productCategoryService;

    /**
     * 商品列表
     * 方法加缓存@Cacheable(cacheNames = "product", key = "123")
     * cacheNames属性 redis的key的前缀
     * key属性 key属性相当于redis的key。动态获取方法参数 #sellerId -- spel表达式
     * condition = "#sellerId.length() > 3" 满足该条件才会进行缓存
     * unless = "#result.getCode() != 0" unless：如果...不... 返回的结果为0时，才会进行缓存。用的挺多，因为不会把错误数据缓存起来
     */
    @RequestMapping("/list")
    @Cacheable(cacheNames = "product", key = "123")
    public ResultVO list() {
        //1.查询所有上架商品
        List<ProductInfo> productInfoList = productInfoService.findUpAll();

        //2.查询所有类目数据（一次性查询，性能高）
        //传统方法
//        List<Integer> categoryTypeList = new ArrayList<>();
//        for (ProductInfo productInfo : productInfoList) {
//            //通过商品信息获取商品类目id
//            Integer categoryType = productInfo.getCategoryType();
//            categoryTypeList.add(categoryType);
//        }
        //精简方法
        List<Integer> categoryTypeList = productInfoList.stream()
                .map(e -> e.getCategoryType())
                .collect(Collectors.toList());
        List<ProductCategory> productCategoryList = productCategoryService.findByCategoryTypeIn(categoryTypeList);

        //3.数据拼装
        //遍历数据库获取到的商品类目信息
        List<ProductVO> productVOList = new ArrayList<>();
        for (ProductCategory productCategory : productCategoryList) {
            //把数据库查询到的商品类目信息设置到商品类目VO
            ProductVO productVO = new ProductVO();
            //设置类目名称
            productVO.setCategoryName(productCategory.getCategoryName());
            //设置类目类型
            productVO.setCategoryType(productCategory.getCategoryType());

            //定义ProductInfoVO类的集合
            List<ProductInfoVO> productInfoVOList = new ArrayList<>();
            //遍历数据库获取到的商品详情数据
            for (ProductInfo productInfo : productInfoList) {
                //判断商品详情的类目类型和商品类目的类目类型一致
                if (productInfo.getCategoryType().equals(productCategory.getCategoryType())) {
                    //把数据库查到的商品详情设置到商品详情VO
                    ProductInfoVO productInfoVO = new ProductInfoVO();
                    BeanUtils.copyProperties(productInfo,productInfoVO);
                    productInfoVOList.add(productInfoVO);
                }
            }
            //设置商品详情数据
            productVO.setProductInfoVOList(productInfoVOList);
            //把商品VO数据添加到集合中
            productVOList.add(productVO);
        }

        return ResultVOUtil.success(productVOList);
    }

}
